[IL2CPP逆向] 某立志传 - 脱离Steam运行
全部标签 我正在寻找VisualStudio的扩展,在Debug模式下可以单步执行除C#之外的中间语言。我不是在寻找调试托管和非托管代码的解决方案。 最佳答案 你的目的是什么?您的IL是由C#编译器生成的还是在运行时动态生成的?如果是前者,您可以使用一个技巧,通过ilasm重新编译您的二进制文件。像往常一样编译C#代码。优化与否无关紧要,但您必须指定编译选项以生成完整的PDB符号。使用ildasm将您的二进制文件转换为.il文件。它是菜单中的转储选项。重新编译.il文件以获得新的二进制文件(和新的符号)ilasm.il[/exe|/dll]/
创建直接发出IL的方法与构建表达式树之间是否存在性能差异? 最佳答案 优秀而复杂的问题。最近之前,Expression根本无法处理所有情况-因此在许多情况下这是毫无疑问的。这随着Expression.Block等的引入而改变。在大多数“常见”情况下,Expression的使用可能绰绰有余,但我承认我没有精确的测量,仅仅是因为虽然我做了很多IL,但我还针对没有像Expression(当然不是Expression.Block)这样的奢侈品的下层框架。我也倾向于使用复杂的“装饰器”方法,这些方法可以很好地在IL中堆叠体操,但不一定进入Ex
在尝试使用迭代器block后,我注意到生成的IL代码不是我期望的那样。生成try-faultblock而不是try-finallyblock,这是我从未见过的。我注意到编译器不允许我在“手写”C#中使用fault关键字。两者有区别吗?C#代码:staticIEnumerableReadAllLines(stringfileName){using(varfile=System.IO.File.OpenText(fileName)){strings;while((s=file.ReadLine())!=null){yieldreturns;}}}MSIL代码:.methodprivateh
UpdateOverayearlater,andIfinallyrealizedthecauseofthisbehavior.Essentially,anobjectcan'tbeunboxedtoadifferenttypethanitwasboxedas(evenifthattypecastsorconvertstothedestinationtype),andifyoudon'tknowthecorrecttypeyouhavetodiscoveritsomehow.Theassignmentmaybeperfectlyvalid,butitisnotfeasibleforthi
为什么C#7编译器将局部函数转换为其父函数所在的同一类中的方法。而对于匿名方法(和Lambda表达式),编译器会为每个父函数生成一个嵌套类,它将包含所有匿名方法作为实例方法?例如,C#代码(匿名方法):internalclassAnonymousMethod_Example{publicvoidMyFunc(string[]args){varx=5;Actionact=delegate(){Console.WriteLine(x);};act();}}将生成类似于以下内容的IL代码(匿名方法):.classprivateautoansibeforefieldinitAnonymousM
我有这段代码发出一些IL指令,这些指令在null对象上调用string.IndexOf:MethodBuildermethodBuilder=typeBuilder.DefineMethod("Foo",MethodAttributes.Public,typeof(void),Array.Empty());varmethodInfo=typeof(string).GetMethod("IndexOf",new[]{typeof(char)});ILGeneratorilGenerator=methodBuilder.GetILGenerator();ilGenerator.Emit(O
假设我们在C#中有以下示例代码:classBaseClass{publicvirtualvoidHelloWorld(){Console.WriteLine("HelloTarik");}}classDerivedClass:BaseClass{publicoverridevoidHelloWorld(){base.HelloWorld();}}classProgram{staticvoidMain(string[]args){DerivedClassderived=newDerivedClass();derived.HelloWorld();}}当我输入以下代码时:.methodpr
当使用DynamicMethod生成IL时,如果您为DynamicMethodconstructor中的restrictedSkipVisibility参数提供“true”,则可以调用方法和访问将无法访问的字段我宁愿将动态IL发送到动态程序集中,这样我就可以在构建时将生成的IL保存到程序集中。如果我使用此方法,则必须使用MethodBuilder而不是DynamicMethod。但是,我需要能够跳过可见性检查,以便在运行动态代码时不会出现MethodAccessException。有没有办法做到这一点,如果可以的话,怎么做? 最佳答案
我正在开发一个发出IL代码的编译器。重要的是,生成的IL由Mono和Microsoft.NETJIT编译器JIT为尽可能最快的机器代码。我的问题是:优化以下模式是否有意义:'stloc.0;ldloc.0;ret'=>'ret''ldc.i4.0;conv.r8'=>'ldc.r8.0'等等,或者JIT是否足够聪明来处理这些?是否有包含Microsoft/MonoJIT编译器执行的优化列表的规范?是否有任何关于优化IL的实用建议/最佳实践的好读物,以便JIT编译器可以反过来生成最佳机器代码(性能方面)? 最佳答案 您描述的两种模式是
我想知道运算符是如何在C#中实现的。我写了一个简单的测试程序(没什么特别的,只是为了演示目的):classBase{publicvoidDisplay(){Console.WriteLine("Base");}}classDerived:Base{}classProgram{staticvoidMain(string[]args){vard=newDerived();if(disBase){varb=(Base)d;d.Display();}}}查看生成的IL代码:.methodprivatehidebysigstaticvoidMain(string[]args)cilmanaged